package negocio.curso;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

import negocio.matricula.ListaMatriculas;
import negocio.matricula.Matricula;
import dados.curso.CursoNaoExistenteException;
import dados.curso.CursosSemCapacidadeArmazenamentoException;
import dados.curso.RepositorioCursosArray;


public class CadastroCursos {
	
	private RepositorioCursosArray cursos;
	
	public CadastroCursos (RepositorioCursosArray r) {
		this.cursos = r;
	}
	
	public void salvarArquivo(String nomeArquivo) throws Exception{
		FileOutputStream saveFile = new FileOutputStream(nomeArquivo);
		ObjectOutputStream save = new ObjectOutputStream(saveFile);
		save.writeObject(this.cursos);
		save.close();
	}
	
	public void cadastrar(Curso curso) throws CursoJaCadastradoException, CursosSemCapacidadeArmazenamentoException{
		if (!cursos.existe(curso.getCodigo())) {
			cursos.inserir(curso);
		}
		else {
			throw new CursoJaCadastradoException(curso);
		}
			
	}
	
	public Curso procurar(String nome) throws CursoNaoExistenteException{
		return cursos.procurar(nome);
	}
	
	
	public void atualizar(Curso curso) throws CursoNaoExistenteException{
		cursos.atualizar(curso);
	}
	
	public void descadastrar(Curso curso) throws CursoNaoExistenteException{
		cursos.descadastrar(curso);
	}
	
	public Curso cursoMenosAlunos(ListaMatriculas listaMatriculas){
		Curso[] cursos = this.cursos.getCursos();
		Matricula[] matriculas = listaMatriculas.getMatriculas().getMatriculas();
		int numeroCursos = this.cursos.getIndice();
		int[] quantidadeAlunos = new int[numeroCursos];
		
		Curso curso = null;
		Matricula matricula = null;
		
		int temIgual = 0;	
		int numeroMatriculas = listaMatriculas.getMatriculas().getIndice();
		
		for (int i = 0; i < numeroCursos; i++) {
			curso = cursos[i];
			temIgual = 0;
			for (int x = 0; x < numeroMatriculas; x++) {
				matricula = matriculas[x];
				
				if (matricula.getCurso().equals(curso)) {
					quantidadeAlunos[i]++;
					temIgual = 1;
				}
			}
			if (temIgual == 0) {
				return curso;
			}
		}
		
		for (int i = 0; i < numeroCursos; i++) {
			if (i == 0) {
				curso = cursos[i];
			} else {
				if (quantidadeAlunos[i] < quantidadeAlunos[i-1]) {
					curso = cursos[i];
				}
			}
			
		}
		return curso;
	}
	
	public ListaCursos listarCursosTodosAlunos(ListaMatriculas listaMatriculas) {
		Curso[] cursos= null;
		Curso curso = null;
		Matricula[] matriculas= null;
		Matricula matricula = null;
		int temIgual = 0;
		matriculas = listaMatriculas.getMatriculas().getMatriculas();
		cursos = this.cursos.getCursos();
		
		int numeroCursos = this.cursos.getIndice();
		int numeroMatriculas = listaMatriculas.getMatriculas().getIndice();
		
		ListaCursos lc = new ListaCursos();
		for (int i = 0; i < numeroCursos; i++) {
			curso = cursos[i];
			temIgual = 0;
			for (int x = 0; x < numeroMatriculas; x++) {
				matricula = matriculas[x];
				if (matricula.getCurso().equals(curso)) {
					temIgual = 1;
				}
			}
			if (temIgual == 1) {
				lc.insert(curso);
			}
			
		}
		return lc;
	}
	
	public ListaCursos listarCursos() {
		Curso[] cursos= null;
		Curso curso = null;
		cursos = this.cursos.getCursos();
		int numeroCursos = this.cursos.getIndice();
		ListaCursos lc = new ListaCursos();
		for (int i = 0; i < numeroCursos; i++) {
			curso = cursos[i];
			lc.insert(curso);
		}
		return lc;
	}	
}



